package com.hucsmn.examsystem.common.message;

import java.io.Serializable;

/**
 * 客户端与服务端之间交换的消息。
 * <p>
 * 消息协议基本可以概括为：
 * 客户端发起连接，发送一个 Message 请求给服务器。
 * 服务器收到 Message 开始处理请求，并将处理的结果包装成另一个 Message 发送回客户端，最后关闭连接。
 * 客户端收到服务器返回的 Message，通过 View 层将结果显示出来。
 * <p>
 * 至于每个消息类型所对应的详细协议描述，请看 MessageKind 的文档。
 *
 * @param <T> 消息主体类型。
 */
public class Message<T extends Serializable> implements Serializable {
    private static final long serialVersionUID = 4917777512970287191L;

    // 消息类型、状态令牌、消息数据。

    private final MessageKind kind;
    private final Token token;
    private final T data;

    public Message(MessageKind kind) {
        this(kind, null, null);
    }

    public Message(MessageKind kind, Token token) {
        this(kind, token, null);
    }

    public Message(MessageKind kind, T data) {
        this(kind, null, data);
    }

    public Message(MessageKind kind, Token token, T data) {
        if (kind == null) {
            throw new NullPointerException();
        }
        this.kind = kind;
        this.token = token;
        this.data = data;
    }

    public MessageKind getMessageKind() {
        return kind;
    }

    public Token getToken() {
        return token;
    }

    public Object getData() {
        return data;
    }
}
